#include <iostream>
using namespace std;

// const 可以替代 #define
//定义一个const时，必须赋值，除非使用extern修饰
#define pi 3.14
extern const float PI;

void test1(){
    const float f1 = 5.0;
    float f2 = 0.0;
    
    //error: float* p1= &f1;    普通指针 不能指向 常量
    //error: float* const p2 = &f1;     指针常量 不能指向 常量
    const float* p3 = &f1;// 常量指针 可以指向 常量
    
    // 均可指向变量
    float* p4 = &f2;
    float* const p5 = &f2; 
    const float* p6 = &f2;
}

int main()
{
    //1、const修饰指针  常量指针
    int a = 10;
    int b = 99;

    int *p1 = &a;
    //普通指针，不能指向常量
    
    const int *p = &a;
    //常量指针：不能通过p指针修改a的值，指针的指向可以改
    //error : *p = 20;
    p = &b;    


    //2、const修饰常量  指针常量
    int * const q = &a;
    //指针常量：指针的指向不可以改，指针指向的值可以改，不可以指向常量
    *q = 100;
    //error : q = &b;


    const int max = 100;
    //error: int* const pv2 = &max;     不可以指向常量


    //3、const修饰指针和常量
    const int * const p2 = &a;
    const int * const p3 = &max; // 可以指向常量
    
    //指针的指向，指针指向的值，均不可修改。
    //error: p2 = &b;
    //error: *p2 = 100;

    return 0;
}